﻿#pragma once
/*
请你来实现一个 myAtoi(string s) 函数，使其能将字符串转换成一个 32 位有符号整数。

函数 myAtoi(string s) 的算法如下：

空格：读入字符串并丢弃无用的前导空格（" "）
符号：检查下一个字符（假设还未到字符末尾）为 '-' 还是 '+'。如果两者都不存在，则假定结果为正。
转换：通过跳过前置零来读取该整数，直到遇到非数字字符或到达字符串的结尾。如果没有读取数字，则结果为0。
舍入：如果整数数超过 32 位有符号整数范围 [−2^31,  2^31 − 1] ，需要截断这个整数，使其保持在这个范围内。具体来说，小于 −2^31 的整数应该被舍入为 −2^31 ，大于 2^31 − 1 的整数应该被舍入为 2^31 − 1 。
返回整数作为最终结果。
*/

#include <string>
#include <cmath>
using namespace std;

namespace Solution
{
	class Solution1 {
	private:
		bool cmpStr(std::string& str1, std::string& str2)
		{
			if (str1.size() > str2.size())
			{
				return true;
			}
			else if (str1.size() < str2.size())
			{
				return false;
			}
			else
			{
				for (int i = 0; i < str1.size(); i++)
				{
					if (str1[i] > str2[i]) return true;
					else if (str1[i] < str2[i]) return false;
				}
			}
			return true;
		}
	public:
		int myAtoi(string s) {
			std::string retStr = "";
			char szChar;
			bool isPositive = true;
			std::string maxVal = "2147483647";
			int maxIntVal = 2147483647;
			std::string maxVal2 = "2147483648";
			int maxIntVal2 = -2147483648;
			bool isInitPos = false;
			for (int i = 0; i < s.size(); i++)
			{
				szChar = s[i];
				if (retStr.size() == 0)
				{
					// 第一步,跳过前导空格
					if (szChar == ' ' && !isInitPos) continue;
					// 第二步,获取正负号
					else if (szChar == '-' && !isInitPos)
					{
						isPositive = false;
						isInitPos = true;
						continue;
					}
					else if (szChar == '+' && !isInitPos)
					{
						isPositive = true;
						isInitPos = true;
						continue;
					}
					// 第三步,跳过前置0
					else if (std::isdigit(szChar))
					{
						retStr += szChar;
					}
					else
					{
						return 0;
					}
				}
				else
				{
					if (std::isdigit(szChar))
					{
						retStr += szChar;
					}
					else
					{
						break;
					}
				}
			}
			std::string realRetStr = "";
			for (auto& sz : retStr)
			{
				if (sz == '0' && realRetStr.size() == 0) continue;
				realRetStr += sz;
			}
			if (realRetStr.size() == 0)
			{
				return 0;
			}
			else if (isPositive && cmpStr(realRetStr, maxVal))
			{
				return maxIntVal;
			}

			else if (!isPositive && cmpStr(realRetStr, maxVal2))
			{
				return maxIntVal2;
			}
			else
			{
				int nSize = realRetStr.size();
				int nRet = 0;
				for (int m = nSize - 1; m >= 0; m--)
				{
					char tmpChar = realRetStr[m];
					int  tmpInt = tmpChar - '0';
					nRet += tmpInt * std::pow(10, nSize - m - 1);
				}
				if (isPositive)
				{
					return nRet;
				}
				else
					return 0 - nRet;
			}
		}
	};

}
